/**
 * 请勿将俱乐部专享资源复制给其他人，保护知识产权即是保护我们所在的行业，进而保护我们自己的利益
 * 即便是公司的同事，也请尊重 JFinal 作者的努力与付出，不要复制给同事
 * 
 * 如果你尚未加入俱乐部，请立即删除该项目，或者现在加入俱乐部：http://jfinal.com/club
 * 
 * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群，以及作者在俱乐部定期的分享与答疑，
 * 价值远比仅仅拥有 jfinal club 项目源代码要大得多
 * 
 * JFinal 俱乐部是五年以来首次寻求外部资源的尝试，以便于有资源创建更加
 * 高品质的产品与服务，为大家带来更大的价值，所以请大家多多支持，不要将
 * 首次的尝试扼杀在了摇篮之中
 */

package com.eric.code.oauth2.login;

import com.eric.code.oauth2.model.User;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.LogKit;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.ehcache.CacheKit;

/**
 * 登录业务
 */
public class LoginService {
	/* 用户类型  0普通用户 1 超级用户*/
	public static final int USER_NORMAL = 0;
	public static final int USER_ADMIN = 1;

	public static final LoginService me = new LoginService();
	private final User accountDao = new User().dao();

	// 存放登录用户的 cacheName
	public static final String loginAccountCacheName = "loginAccount";

	// "jfinalId" 仅用于 cookie 名称，其它地方如 cache 中全部用的 "sessionId" 来做 key
	public static final String sessionIdName = "oauth2id";

	/**
	 * 登录成功返回 sessionId 与 loginAccount，否则返回一个 msg
	 */
	public Ret login(String userName, String password) {

		User loginAccount = accountDao.findFirst("select * from oauth2_user where email=? limit 1", userName);
		if (loginAccount == null) {
			return Ret.fail("msg", "用户名或密码不正确");
		}

		String hashedPass = HashKit.md5(password);
		// 未通过密码验证
		if (loginAccount.getPassword().equals(hashedPass) == false) {
			return Ret.fail("msg", "用户名或密码不正确");
		}

		String sessionId = HashKit.md5(userName);
        // 保存一份 sessionId 到 loginAccount 备用
		CacheKit.put(loginAccountCacheName, sessionId, loginAccount);

		return Ret.ok(sessionIdName,sessionId).set("type",loginAccount.getType());   // 用于设置 cookie 的最大存活时间
	}


	/**
	 * 当用户改变信息时需要重置用户缓存信息
	 * @param user
     */
	public void resetUserCache(User user){
		if(user != null){
			user  = accountDao.findFirst("select * from oauth2_user where id=? limit 1", user.getId());
			String sessionId = HashKit.md5(user.getEmail());
			// 保存一份 sessionId 到 loginAccount 备用
			CacheKit.put(loginAccountCacheName, sessionId, user);
		}
	}
	/**
	 * 退出登录
	 */
	public void logout(String sesstionId) {
		if (sesstionId != null) {
			CacheKit.remove(loginAccountCacheName, sesstionId);
		}
	}

}
